//node.js连接mongodb数据库

//引入mongodb插件
const mongodb = require('mongodb').MongoClient
const url = "mongodb://localhost:27017/";
//    //mongodb连接
// mongodb.connect(url,function(err,db){
//     if(err) throw err
//     console.log("连接数据库成功!")
//     //_____
//     db.close()    //关掉数据库连接
// })

// 新建数据库
// var mongodb = require('mongodb').mongodb;
// var url = "mongodb://localhost:27017/runoob";      //"/"后面添加新建数据库名 或者在connect方法的url参数中尾部添加
// connect(url, function(err, db) {
//     if (err) throw err;
//     console.log("数据库已创建!");
//     db.close();
//   });


//新建集合
// var mongodb = require('mongodb').mongodb;
// var url = 'mongodb://localhost:27017/';
// mongodb.connect(url, function (err, db) {
//     if (err) throw err;
//     let dbase = db.db("sang");
//     dbase.createCollection('1234clooe', function (err, res) {       //新建一个orders的数据库
//         if (err) throw err;
//         console.log("创建集合!" );
//         db.close();
//     });
// });

//插入数据
// mongodb.connect(url, function(err, db) {
//     if (err) throw err;
//     var dbo = db.db("sang");
//     var dbs = {'name':"鲁迅", "book" : "呐喊", "price" : 38, "publisher" : "人民文学出版社" }
//     // 插入数据库       插入多条数据insertOne改为insertMany dbs参数改为对象数组
//     dbo.collection("orders").insertOne(dbs, function(err, res) {
//         if (err) throw err;
//         console.log("文档插入成功");
//         db.close();
//     });
//   });




// 查询数据
// const mongodb = require('mongodb').MongoClient
// const url = "mongodb://localhost:27017/";
// mongodb.connect(url,(err,db)=>{
//     if(err) throw err
//     let dbo = db.db('sang')
//     dbo.collection('collect').find().toArray((err,res)=>{
//         if (err) throw err
//         console.log(res)
//         db.close()
//     })
// })


//查询某一条数据
// const mongodb = require('mongodb').MongoClient
// const url = "mongodb://localhost:27017/";
// mongodb.connect(url,(err,db)=>{
//     if(err) throw err
//     let dbo = db.db('sang')
//     let str = {name:'钱钟书'}
//     dbo.collection('collect').find(str).toArray((err,res)=>{
//         if (err) throw err
//         console.log(res)
//         db.close()
//     }) 
// })



// 更新一条数据
// const mongodb = require('mongodb').MongoClient
// const url = "mongodb://localhost:27017/";
// mongodb.connect(url,(err,db)=>{
//     if(err) throw err
//     let dbo = db.db('sang')
//     let str = {name:'李易峰'}
//        let str0 = {$set:{name:'钱钟书'}}
//     dbo.collection('collect').updateOne(str,str0,(err,res)=>{
//         if (err) throw err
//         console.log(res)
//         db.close()
//     })  
// })

//更新多条数据
// var mongodb = require('mongodb').mongodb;
// var url = "mongodb://localhost:27017/";

// mongodb.connect(url, function(err, db) {
//     if (err) throw err;
//     var dbo = db.db("sang");
//     var whereStr = {name: '钱钟书'};  // 查询条件
//     var updateStr = {$set: {price:6999}};
//     dbo.collection("collect").updateMany(whereStr, updateStr, function(err, res) {
//         if (err) throw err;
//         // console.log(res)
//          console.log(res.modifiedCount + " 条文档被更新");
//         db.close();
//     });
// });


// 删除数据
// var mongodb = require('mongodb').mongodb;
// var url = "mongodb://localhost:27017/";

// mongodb.connect(url, function(err, db) {
//     if (err) throw err;
//     var dbo = db.db("sang");
//     var whereStr = {"name":'钱钟书'};  // 查询条件
//     dbo.collection("collect").deleteOne(whereStr, function(err, obj) {  //删除多条数据用deleteMany
//         if (err) throw err;
//         console.log("文档删除成功：",obj);      
//         db.close();
//     });
// });



//按 price 升序排列  price为文档的一个字段

// const mongodb = require('mongodb').MongoClient
// const url = "mongodb://localhost:27017/";
// mongodb.connect(url,(err,db)=>{
//     if(err) throw err
//     let dbo = db.db('sang')
//     let mysort = { price: 1 };     //price 的值: 1:升序，-1：降序
//     dbo.collection('collect').find().sort(mysort).toArray((err,res)=>{
//         if (err) throw err
//         console.log(res)
//         db.close()
//     }) 
// })




//查询分页

// 读取两条记录 limit(2)
// const mongodb = require('mongodb').MongoClient
// const url = "mongodb://localhost:27017/";

// mongodb.connect(url, function(err, db) {
//     if (err) throw err;
//     var dbo = db.db("sang");
//     dbo.collection("collect").find().limit(2).toArray(function(err, result) {
//         if (err) throw err;
//         console.log(result);
//         db.close();
//   });
// });

// skip(): 跳过前面两条数据，读取两条数据
// const mongodb = require('mongodb').MongoClient
// const url = "mongodb://localhost:27017/";
// mongodb.connect(url, function(err, db) {
//     if (err) throw err;
//     var dbo = db.db("sang");
//     dbo.collection("collect").find().skip(2).toArray(function(err, result) {
//         if (err) throw err;
//         console.log(result);
//         db.close();
//   });
// });



/* 
 mongoDB 不是一个关系型数据库，但我们可以使用 $lookup 来实现左连接。
例如我们有两个集合数据分别为：
集合1：orders
[
  { _id: 1, product_id: 154, status: 1 }
]
集合2：products
[
  { _id: 154, name: '笔记本电脑' },
  { _id: 155, name: '耳机' },
  { _id: 156, name: '台式电脑' }
]
*/

// $lookup 实现左连接

// var mongodb = require('mongodb').MongoClient;
// var url = "mongodb://127.0.0.1:27017/";

// mongodb.connect(url, function(err, db) {
//   if (err) throw err;
//   var dbo = db.db("sang");
//   dbo.collection('orders').aggregate([
//     { $lookup:
//        {
//          from: 'products',            // 右集合
//          localField: 'product_id',    // 左集合 join 字段
//          foreignField: '_id',         // 右集合 join 字段
//          as: 'orderdetails'           // 新生成字段（类型array）
//        }
//      }
//     ]).toArray(function(err, res) {
//     if (err) throw err;
//     console.log(JSON.stringify(res));
//     db.close();
//   });
// });


//删除集合  totalPrice
// mongodb.connect(url,(err,db)=>{
//     if(err) throw err
//     let dbo = db.db('sang')
//     dbo.collection('1234clooe').drop((err,res)=>{   // 执行成功 res 返回 true，否则返回 false
//         if(err) throw err
//         if(res){
//             console.log("230:集合删除成功！：",res)
//         }else{
//             console.log("232:集合删除失败！")
//         }
//         db.close()
//     })

// })



/*
    使用 Promise
    Promise 是一个 ECMAScript 6 提供的类，目的是更加优雅地书写复杂的异步任务。

    如果你还不了解 Promise，可以参考 JavaScript Promise。

    以下实例使用 Promise 创建集合：
*/
// 使用Promise语法格式创建集合
// const mongodb = require("mongodb").MongoClient;
// const url = "mongodb://localhost/";
// mongodb.connect(url).then((conn) => {
//     console.log("数据库已连接");
//     var dbase = conn.db("sang");
//     dbase.createCollection("Promise").then((res) => {
//         console.log("已创建集合");
//     }).catch((err) => {
//         console.log("数据库操作错误");
//     }).finally(() => {
//         conn.close();
//     });
// }).catch((err) => {
//     console.log("数据库连接失败");
// });




// 使用promise 数据操作
// mongodb.connect(url).then((db) => {
//     console.log("数据库连接成功!")
//     const bdo = db.db('sang').collection('Promise')
//     let books = [{
//         book: '三毛从军纪',
//         authername: 'unkown'
//     }, {
//         book: '骆驼祥子',
//         authername: '老舍'
//     }, {
//         book: '围城',
//         authername: '钱钟书'
//     }, {
//         book: '三国演义',
//         authername: '罗贯中'
//     }, {
//         book: '水浒传',
//         authername: '施耐庵'
//     }]
//     // 增加
//     bdo.insertMany(books).then((res) => {
//             //查询文档
//             return bdo.find().toArray().then((res) => {
//                 console.log('查询增加成功！：', res)
//             })
//         })
//         .then(() => {
//             // 更改
//             return bdo.updateOne({
//                 book: '三毛从军纪'
//             }, {
//                 $set: {
//                     authername: '张乐平'
//                 }
//             }).then((res) => {
//                 //查询文档
//                 return   bdo.find().toArray().then((res) => {
//                    console.log('查询更改成功！：', res)
//                 })
//             })
//         })
//         .then(() => {
//             //删除
//             return bdo.deleteOne({
//                 book: '水浒传'
//             }).then((res) => {
//                 //查询文档
//                 return  bdo.find().toArray().then((res) => {
//                     console.log('查询删除成功！：', res)
//                 })
//             })
//         })
//         .catch((err) => {
//             console.log("数据操作失败" + err.message);
//         }).finally(() => {
//             db.close()
//         });
// }).catch((err) => {
//     console.log('数据库连接失败！')
// })




// const MongoClient = require("mongodb").MongoClient;
// const url = "mongodb://localhost/";
// mongodb.connect(url).then((conn) => {
//     console.log("数据库已连接");
//     const test = conn.db("sang").collection("test");
//     // 增加
//     test.insertOne({
//         "site": "runoob.com"
//     }).then((res) => {
//         // 查询
//         return test.find().toArray().then((arr) => {
//             console.log(arr);
//         });
//     }).then(() => {
//         // 更改
//         return test.updateMany({
//             "site": "runoob.com"
//         }, {
//             $set: {
//                 "site": "example.com"
//             }
//         });
//     }).then((res) => {
//         // 查询
//         return test.find().toArray().then((arr) => {
//             console.log(arr);
//         });
//     }).then(() => {
//         // 删除
//         return test.deleteMany({
//             "site": "example.com"
//         });
//     }).then((res) => {
//         // 查询
//         return test.find().toArray().then((arr) => {
//             console.log(arr);
//         });
//     }).catch((err) => {
//         console.log("数据操作失败" + err.message);
//     }).finally(() => {
//         conn.close();
//     });
// }).catch((err) => {
//     console.log("数据库连接失败");
// });